// 请求封装
import { getToken } from './auth.js'

// 开发环境
const isDev = process.env.NODE_ENV === 'development'

// API基础路径配置
const API_CONFIG = {
  // 默认API服务器
  DEFAULT: {
    dev: '/api-server', 
    prod: 'http://120.76.99.113:7102'
  },
  // 地图API
  MAP: {
    dev: '/map-api',
    prod: 'https://apis.map.qq.com'
  },
}

/**
 * 根据API类型获取基础URL
 * @param {String} apiType - API类型，如'DEFAULT', 'MAP', 'THIRD'
 * @returns {String} 对应环境的基础URL
 */
const getBaseUrl = (apiType = 'DEFAULT') => {
  const config = API_CONFIG[apiType] || API_CONFIG.DEFAULT
  return isDev ? config.dev : config.prod
}

// 请求拦截器
const httpInterceptor = {
  invoke(options) {
    // 获取API类型
    const apiType = options.apiType || 'DEFAULT'
    
    // 1. 非http开头URL添加相应的baseUrl
    if (!options.url.startsWith('http')) {
      // 对特定的路径进行特殊处理（兼容旧代码）
      if (options.url.startsWith('/xaygf-api')) {
        // 保留原始路径
      } else {
        options.url = getBaseUrl(apiType) + options.url
      }
    }
    
    // 2. 请求超时
    options.timeout = 10000
    
    // 3. 添加小程序端请求头标识
    options.header = {
      ...options.header,
      'Content-Type': 'application/json'
    }
    
    // 4. 添加token请求头标识
    const token = getToken()
    if (token) {
      options.header.Authorization = `Bearer ${token}`
    }
    
    // 5. 根据API类型添加特定的请求头
    if (apiType === 'MAP' && isDev) {
      options.header.Referer = 'https://lbs.qq.com'
    }
    
    // 6. 禁用sockjs请求的withCredentials
    // 避免跨域请求带上credentials导致CORS错误
    if (options.url.includes('sockjs-node')) {
      options.withCredentials = false;
    }
  }
}

// 注册拦截器
uni.addInterceptor('request', httpInterceptor)
uni.addInterceptor('uploadFile', httpInterceptor)

/**
 * 请求函数
 * @param {Object} options - 请求配置
 * @param {String} options.apiType - API类型，如'DEFAULT', 'MAP', 'THIRD'
 * @returns {Promise} 请求结果Promise
 */
export const http = (options) => {
  // 对于sockjs-node的请求，确保不发送credentials
  if (options.url && options.url.includes('sockjs-node')) {
    options.withCredentials = false;
  }
  
  return new Promise((resolve, reject) => {
    uni.request({
      ...options,
      success: (res) => {
        // 状态码2xx，则走成功
        if (res.statusCode >= 200 && res.statusCode < 300) {
          resolve(res.data)
        } else if (res.statusCode === 401) {
          // 401错误 - 清理用户信息，跳转到登录页
          uni.removeStorageSync('token')
          uni.showToast({
            title: '请先登录',
            icon: 'none'
          })
          setTimeout(() => {
            uni.navigateTo({
              url: '/pages/login/login'
            })
          }, 1500)
          reject(res)
        } else {
          // 其他错误
          uni.showToast({
            title: res.data.message || '请求失败',
            icon: 'none'
          })
          reject(res)
        }
      },
      fail: (err) => {
        uni.showToast({
          title: '网络错误',
          icon: 'none'
        })
        reject(err)
      }
    })
  })
} 